出处:掘金

原作者:金泽宸


构建一个“配置即页面”的系统,不是为了少写代码,而是为了少改代码

写在前面

当前端系统规模日益庞大、业务变更频繁时,我们需要从“写死代码”转变为“平台配置驱动”

这一篇,我们系统拆解可配置平台的演进路径:组件 → schema → DSL → 可视化低代码平台

典型场景:为什么要可配置?

场景 原始方式 配置方式
广告位/弹窗投放 写死 if (city == '广州') 后台配置 city = 广州
营销活动页 每次新建页面 拖拽组件配置活动
表单页 页面硬编码输入框 JSON schema 生成表单
数据展示 表格字段固定 动态配置列、筛选、接口
H5 落地页 多版本维护 单引擎 + 配置区分

平台演进路线

graph TB
A[纯组件封装] --> B[配置驱动组件]
B --> C[Schema 化页面描述]
C --> D[DSL Domain Language]
D --> E[低代码可视化平台]

第一阶段:组件封装

例如封装一个 Banner 组件:

<template>
  <img :src="data.imgUrl" :alt="data.alt" />
</template>

<script setup>
defineProps(['data'])
</script>

用户通过:

<Banner :data="xxx" />

缺点是页面结构和内容写死

第二阶段:配置驱动组件渲染

使用配置 JSON 渲染多个组件:

const pageConfig = [
  { type: 'banner', props: { imgUrl: '/a.jpg' } },
  { type: 'form', props: { fields: [...] } },
  { type: 'table', props: { columns: [...], api: '/list' } }
]

动态渲染:

<component :is="resolveComponent(cfg.type)" v-bind="cfg.props" v-for="cfg in pageConfig" />

resolveComponent 映射到注册组件即可

第三阶段:页面级 Schema 驱动

借助 JSON Schema 或自定义结构:

{
  "page": {
    "title": "用户列表",
    "body": [
      { "type": "searchForm", "fields": ["name", "age"] },
      { "type": "dataTable", "columns": ["name", "age"], "api": "/api/user/list" }
    ]
  }
}

优势:

第四阶段:抽象领域 DSL

引入领域语言 DSL(Domain Specific Language),封装业务语义:

page:
  title: 用户中心
  layout: vertical
  components:
    - $form:
        bind: userForm
        fields:
          - $input: { label: 姓名, key: name }
          - $select: { label: 性别, key: gender, options: 男/女 }
    - $dataTable:
        bind: userList
        api: /api/user/list
        columns: [name, gender]

优势:

第五阶段:可视化低代码平台

引擎层核心模块:

模块 功能
组件库 所有渲染组件(Banner, Table, Form)
渲染引擎 把 DSL 渲染成组件结构
事件系统 处理交互/跳转/API
权限系统 控制组件显隐、可点击
发布系统 配置版本管理/灰度上线

现成方案:

核心代码:渲染引擎简版

function renderSchema(schema) {
  return schema.components.map(cfg => {
    const Comp = componentMap[cfg.type]
    return <Comp {...cfg.props} />
  })
}

支持嵌套、权限、条件展示:

if (cfg.permission && !hasPermission(cfg.permission)) return null
if (cfg.visible === false) return null

平台与团队协作模式重构

角色 职责
前端 构建组件/引擎/渲染器
产品 配置页面结构
运营 搭建活动页
后端 提供数据接口
QA 复用 DSL 进行测试用例生成